// const fetch = function(idx) {
//   return new Promise(resolve => {
//     console.log(`start request ${idx}`);
//     const timeout = parseInt(Math.random() * 1e4);
//     setTimeout(() => {
//       console.log(`end request ${idx}`);
//       resolve(idx)
//     }, timeout)
//   })
// };


// function fetchAll(urls, limit) {
//   return new Promise((resolve, reject) => {
//     const urlCount = urls.length;
//     const requestsQueue = [];
//     const results = [];
//     let i = 0;
//     const handleRequest = url => {
//       const req = fetch(url).then(res => {
//         console.log('当前并发： ' + requestsQueue);
//         const len = results.push(res);
//         if (len < urlCount && i + 1 < urlCount) {
//           requestsQueue.shift();
//           handleRequest(urls[++i]);
//         } else if (len === urlCount) {
//           resolve(results);
//         }
//       }).catch(err => {
//         reject(err);
//       })
//       if (requestsQueue.push(req) < limit) {
//         handleRequest(urls[++i]);
//       }
//     };
//     handleRequest(urls[i]);
//   })
// }

// // fetchAll([
// //   'https://www.baidu.com',
// //   'http://www.google.com',
// //   'https://www.bytedance.com',
// //   'https://www.tx.com'
// // ], 3).then(res => {
// //     console.log(res.length); // 4
// //   })

// fetchAll([1, 2, 3, 4], 3).then(res => {
//   console.log(res);
//   console.log(res.length); // 4
// })

var p1 = new Promise((resolve, reject) => {
  resolve('p1');
});
var p2 = new Promise((resolve, reject) => {
  resolve('p2');
});
var p3 = new Promise((resolve, reject) => {
  reject('p3');
});
console.log([p1, p2, p3].map(p => p.catch(e => '出错后返回的值')));
Promise.all([p1, p2, p3].map(p => p.catch(e => '出错后返回的值')))
  .then(values => {
    console.log(values);
  }).catch(err => {
    console.log(err);
  })